package org.logsin37.tool.eurekamanager.infra.repository;

import org.logsin37.tool.eurekamanager.domain.entity.FrozenConfig;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * Frozen Config Repository
 *
 * @author logsin37 2021-11-15
 */
public interface FrozenConfigRepository {

    String CONFIG_KEY = "eureka-manage:frozen-config";
    String STATUS_KEY = "eureka-manage:frozen-status";

    /**
     * 列出所有的冻结配置
     *
     * @return 所有的冻结配置, 只有code
     */
    Flux<FrozenConfig> listFrozenConfig();

    /**
     * eureka代码查询冻结配置
     *
     * @param eurekaCode eureka代码
     * @return 冻结配置
     */
    Mono<FrozenConfig> getFrozenConfigByEurekaCode(String eurekaCode);

    /**
     * 保存冻结配置
     *
     * @param frozenConfig 冻结配置
     * @return 处理结果
     */
    Mono<Void> saveFrozenConfig(FrozenConfig frozenConfig);

    /**
     * 根据eureka代码移除冻结配置
     *
     * @param eurekaCode eureka代码
     * @return 操作结果
     */
    Mono<Void> removeFrozenConfigByEurekaCode(String eurekaCode);

    /**
     * 登记冻结状态
     *
     * @param eurekaCode Eureka代码
     * @return void
     */
    Mono<Void> saveFrozenRecord(String eurekaCode);

    /**
     * 移除冻结状态登记
     *
     * @param eurekaCode Eureka代码
     * @return void
     */
    Mono<Void> dropFrozenRecord(String eurekaCode);

    /**
     * 获取冻结状态
     *
     * @param eurekaCode Eureka代码
     * @return 冻结状态
     */
    Mono<Boolean> isFrozen(String eurekaCode);
}
